const db = require('../db/index')
//导入 bcryptjs 密码加密包
const bcrypt = require('bcryptjs')
//导入生成 Token 的包
const jwt = require('jsonwebtoken')
//导入全局配置文件
const config = require('../config')

// 注册
exports.register = (req,res) =>{
    const reginfo = req.body
    if(reginfo.account === '' || reginfo.password === '') return res.cc('账号或者密码不能为空')
    const sql = 'select * from users where account=?'
    db.query(sql,reginfo.account,(err,results) =>{
        if(err) return res.cc(err)
        //判断用户名是否被占用
        if(results.length > 0) return res.cc('用户名被占用，请更换其他用户名！')
        //调用 bcrypt.hashSync() 对密码进行加密
        reginfo.password = bcrypt.hashSync(reginfo.password,10)
        //定义插入新用户 SQL 语句
        const sql = 'insert into users set ?'
        const identity = '用户'
        const department = '无'
        const create_time = new Date()
        //调用 db.query() 执行 SQL 语句
        db.query(sql,{
            account:reginfo.account,
            password:reginfo.password,
            identity,
            department,
            create_time,
            status:0
        },(err,results) =>{
            //判断 SQL 语句是否执行成功
            if(err) return res.cc(err)
            //判断影响行数是否为 1
            if(results.affectedRows !== 1) return res.cc('注册用户失败，请稍后再试！')
            //注册用户成功
            res.cc('注册成功！',200)
        }) 
    })
}

// 登录
exports.login = (req,res) =>{
    const loginfo = req.body
    const sql = `select * from users where account=?`
    // 执行 SQL 语句，根据用户名查询用户的信息
    db.query(sql, [loginfo.account], (err, results) => {
        // 执行 SQL 语句失败
        if (err) return res.cc(err)
        // 执行 SQL 语句成功，但是获取到的数据条数不等于 1
        if (results.length !== 1) return res.cc('登录失败！')
        // TODO：判断密码是否正确
        const compareResult = bcrypt.compareSync(loginfo.password,results[0].password)
        if (!compareResult) return res.cc('登录失败！')
        // 判断账号是否被冻结
        if(results[0].status == 1) return res.cc('账号被冻结了，无法登录')
        // 在服务器端生成 Token 的字符串
        const user = { ...results[0], password: '', imageUrl: '', create_time:'', updata_time:'' }
        // 对用户的信息进行加密，生成 Token 字符串
        const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: config.expiresIn })
        // 调用 res.send() 将 Token 响应给客户端
        res.send({
            results:results[0],
            status:200,
            message:'登录成功！',
            token:'Bearer ' + tokenStr
        })
    })
}